//
//  UITextView+Extension.swift
//  表情键盘
//
//  Created by iOS on 16/9/29.
//  Copyright © 2016年 iOS. All rights reserved.
//

import UIKit

extension UITextView {
    
    /// 获取表情名称字符串
    func emoticonNameText() -> String {
        var text: String = ""
        let range = NSRange(location: 0, length: attributedText.length)
        attributedText.enumerateAttributes(in: range, options: []) { (dict, range, _) in
            // 每次遍历到一段内容就会调用一次, 可以根据范围截取需要字符串,如果是图片,在dict中会包含 NSAttachment 这个key
            //            print("遍历到了内容: range:\(range.location) - \(range.length), dict: \(dict)")
            
            if let attachment = dict["NSAttachment"] as? HMTextAttachment {
                // 图片表情
                text += attachment.chs ?? "找不到表情"
            } else {
                // 普通文本或emoji表情,截取文本
                let str = (attributedText.string as NSString).substring(with: range)
                
                text += str
            }
        }
        
        return text
    }
    
    
    /// 添加一个表情到TextView中
    ///
    /// - parameter emoitcon: 表情模型
    func insertEmoticon(emoitcon: HMEmoticonModel) {

        // emoji表情
        if let emoji = emoitcon.emoji {
            // 将emoji(文本)添加到textView中
            insertText(emoji)
            return
        }
        
        // 图片表情
        if let fullPngPath = emoitcon.fullPngPath {
            // 1.生成图片
            let image = UIImage(named: fullPngPath)
            
            // 图片是不能直接添加到textView文本中的.和发邮件一样可以使用附件(属性文本)
            // 2.将图片转成附件
            let attachment = HMTextAttachment()
            attachment.image = image
            attachment.chs = emoitcon.chs
            let height = font?.lineHeight ?? 0
            // 设置附件大小
            // frame 往下移动 设置y 为正数
            // bounds 和 frame相反 往下移动 设置y 为负数
            attachment.bounds = CGRect(x: 0, y: -3, width: height, height: height)
            
            // 3.将附件转成属性文本
            let attributeText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            // 3.0.1 给附件添加font属性
            attributeText.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            
            
            // 3.1获取当前textView中的属性文本
            let currentAttributeText = NSMutableAttributedString(attributedString: attributedText)
            // 3.2获取当前选中的范围
            let currentSelectedRange = selectedRange
            // 3.3当图片的属性文本添加到现有的属性文本中
            currentAttributeText.replaceCharacters(in: currentSelectedRange, with: attributeText)
            
            // 4.让textView显示属性文本
            attributedText = currentAttributeText
            // 5.重新设置光标位置
            let newSelectedRange = NSRange(location: currentSelectedRange.location + 1, length: 0)
            selectedRange = newSelectedRange
        }
    }
}
